package com.caocaog.market.service;

import com.caocaog.market.entity.GoodsBase;
import com.caocaog.market.entity.dto.GoodsDTO;
import com.caocaog.market.entity.vo.AllGoodsVO;
import com.caocaog.market.entity.vo.GoodsVO;
import org.apache.xmlbeans.impl.xb.xsdschema.All;

import javax.validation.constraints.NotNull;
import java.util.List;

/**
 * 商品信息
 *
 * @author chechen
 * @date 2022-04-12
 */
public interface GoodsService {

    /**
     * 小程序进入店铺时，根据店铺id获取所有商品信息（商品分类 + 商品基础 + 商品属性 + 商品规格）
     *
     * @param shopId 店铺id
     * @return 商品分类 + 商品基础 + 商品属性 + 商品规格
     */
    List<AllGoodsVO> getAllGoodsInfo(@NotNull String shopId);

    /**
     * 根据店铺Id获取到商品List
     *
     * @param shopId 商品Id
     * @return 查询到的商品List
     */
    List<GoodsVO> getAllGoodsInfoByShopId(String shopId);

    /**
     * 热门推荐商品
     *
     * @param shopId 店铺id
     * @return 热门的商品展示List
     */
    List<GoodsVO> getHotGoodsInfoByShopId(String shopId);

    /**
     * 首页展示的商品
     *
     * @param shopId 店铺id
     * @return 热门的商品展示List
     */
    List<GoodsVO> getIndexGoodsInfoByShopId(String shopId);

    /**
     * 小程序进入店铺时，根据店铺id获取首个商品规格内的商品信息（商品分类 + 商品基础 + 商品属性 + 商品规格）
     *
     * @param shopId 店铺id
     * @return 商品分类 + 商品基础 + 商品属性 + 商品规格
     */
    List<AllGoodsVO> getFirstCategoriesGoodsInfo(@NotNull String shopId);

    /**
     * 根据商品分类id获取商品信息（商品基础 + 商品属性 + 商品规格）
     *
     * @param categoriesId 商品分类id
     * @return 商品基础 + 商品属性 + 商品规格
     */
    List<GoodsVO> getGoodsInfoByCategoriesId(String categoriesId);

    /**
     * 新增商品信息+规格+属性（缓存）
     *
     * @param goods 商品信息+规格+属性
     * @return 商品基础信息
     */
    GoodsVO addGoods(GoodsDTO goods);

    /**
     * 编辑商品信息+规格+属性（缓存）
     *
     * @param goods 商品信息+规格+属性
     * @return 商品基础信息
     */
    GoodsVO editGoods(GoodsDTO goods);

    /**
     * 删除商品信息+规格+属性（缓存）
     *
     * @param ids 商品ids
     * @return 受影响行数
     */
    int deleteGoods(String... ids);

    /**
     * 根据频道ID查询商品信息，走缓存
     * @param channelId 频道ID
     * @return 查询结果
     */
    List<GoodsBase> getAllGoodsByChannel(String channelId);
}
